<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // myForEach   遍历数组
        

        // function myForEach(arr , cb) {
        //     for(var i in arr) {
        //         cb(arr[i] , i , arr)
        //     }
        // }


        // myForEach([1,2,3] , function(v , i) {
        //     console.log(v);
        // })




        // map 改变数组中的值，且返回新的数组


        // 都+3
        // function myMap(arr) {
        //     var arr2 = [] ;
        //     for(var i in arr) {
        //         var v = arr[i] + 3 ;
        //         arr2.push(v) ;
        //     }
        //     return arr2 ;
        // }

        // // 都*2
        // function myMap(arr) {
        //     var arr2 = [] ;
        //     for(var i in arr) {
        //         var v = arr[i] * 2 ;
        //         arr2.push(v) ;
        //     }
        //     return arr2 ;
        // }



        function myMap(arr  , cb) {
            var arr2 = [] ;
            for(var i in arr) {
                // arr[i] + 3 提取为参数   cb这个函数一定要有返回值
                var v = cb(arr[i]) ;
                arr2.push(v) ;
            }
            return arr2 ;
        }


        var res = myMap([1,2,3] , function(v) {
            return v * 4 ;
        })

        console.log(res);




        // some  判断数组中是否有满足条件的值
        //   大于2
        // function mySome(arr) {
        //     for(var i in arr) {
        //         if(arr[i] > 2) {
        //             return true 
        //         }
        //     }
        //     return false
        // }


        function mySome(arr , cb) {

            for(var i in arr) {
                if(cb(arr[i])) {
                    return true 
                } 
            }
            return false
        }


        var res = mySome(['a1' , 'a2' , 'b1' , 'cc'] , function(v) {
            return v.includes('a')
        })

        console.log(res);


        // every  是否每一个都满足条件
        // function myEvery(arr , cb) {
        //     for(var i in arr) {
        //         // 只要有一个不满足就return false
        //         if(!cb(arr[i])) {
        //             return false ;
        //         }
        //     }
        //     return true ;
        // }

        // function myEvery(arr , cb) {
        //     // 假设每个值都是满足条件的 
        //     var flag = true ;
        //     for(var i in arr) {
        //         // 只要有一个不满足就return false
        //         if(!cb(arr[i])) {
        //             flag = false ;
        //             // break ;
        //             return false ;
        //         }
        //     }
        //     return flag ;
        // }


        function myEvery(arr , cb) {
            // for(var i in arr) {
            //     // 只要有一个不满足就不需要继续循环
            //     if(!cb(arr[i])) {
            //         break ;
            //     }
            // }
            // return i == arr.length - 1

            for(var i = 0 ; i < arr.length ; i++) {
                // 只要有一个不满足就不需要继续循环
                if(!cb(arr[i])) {
                    break ;
                }
            }
            return i === arr.length
        }


        console.log(myEvery([1,2,,3] , function(v) {
            return v > 0
        }));



        // filter  找到满足条件的 ，返回新的数组

        function myFilter(arr , cb) {
            var res = [] ;
            for(var i = 0 ; i < arr.length ; i++) {
                if(cb(arr[i])) {
                    res.push(arr[i])
                }
            }
            return res ;
        }


        console.log(myFilter([1,2,,3] , function(v) {
            return v > 1
        }));



        // reduce(arr , cb , init)  返回一个归并的结果
        
        // var arr = [1,2,3] ;

        // // 100的基础上进行求和
        // var res = arr.reduce(function(prev , v) {
        //     return prev + v
        // } ,100 )


        // myReduce

        // // 求和
        // function myReduce(arr) {
        //     var res = 0 ;
        //     for(var i = 0 ; i < arr.length ; i++) {
        //         res += arr[i]
        //     }
        //     return res ;
        // }

        // // 求乘积
        // function myReduce(arr) {
        //     var res = 1 ;
        //     for(var i = 0 ; i < arr.length ; i++) {
        //         res *= arr[i]
        //     }
        //     return res ;
        // }



        // 
        // function myReduce(arr , cb) {
        //     // 初始值就等于数组的第一个值
        //     var res = arr[0] ;
        //     for(var i = 1 ; i < arr.length ; i++) {
        //         // res = res + arr[i] ;
        //         // res = res * arr[i] ; 
        //         res = cb(res , arr[i]) ;
        //     }
        //     return res ;
        // }


        function myReduce(arr , cb , init) {

            // 如果没有传参数init   init就是undefined
            if(arguments.length < 3){
               // 初始值就等于数组的第一个值
                var res = arr[0] ;
                for(var i = 1 ; i < arr.length ; i++) {
                    // res = res + arr[i] ;
                    // res = res * arr[i] ; 
                    res = cb(res, arr[i]) ;
                }
                return res
            } else {
                // 如果传了三个参数  res=init
                var res = init ;
                for(var i = 0 ; i < arr.length ; i++) {
                    // res = res + arr[i] ;
                    // res = res * arr[i] ; 
                    res = cb(res , arr[i]) ;
                }
                return res
            }
            
        }


        var res = myReduce([1,2,3 , 4] , function(prev , v) {
            return prev + v ;
        } , '')

        console.log(res);


    </script>
    
</body>
</html>